/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.jjsoft.celularessuc.gco.neg;

import com.jjsoft.celularessuc.gco.dao.GenericController;
import com.jjsoft.celularessuc.gco.mdl.Articulo;
import com.jjsoft.celularessuc.gco.mdl.Articulosucursal;
import com.jjsoft.celularessuc.gco.mdl.Proveedor;
import com.jjsoft.celularessuc.gco.mdl.ProveedorArticulo;
import com.jjsoft.celularessuc.gco.mdl.Serie;
import com.jjsoft.celularessuc.gco.mdl.Sucursal;
import com.jjsoft.celularessuc.gco.util.ArticuloValidadorException;
import com.jjsoft.celularessuc.gco.util.AtributoInvalidoException;
import com.jjsoft.celularessuc.gco.util.IdDuplicadoException;
import com.jjsoft.celularessuc.gco.util.ValidarAtributoUtil;
import com.jjsoft.celularessuc.gco.util.configuraciones;
import java.util.List;

/**
 *
 * @author Johnny
 */

public class ArticuloManager {

    GenericController<Articulo> controladorArticulo = new GenericController<Articulo>();
    GenericController<ProveedorArticulo> controladorProvArt = new GenericController<ProveedorArticulo>();

    public void crearProducto(Articulo producto, List<Proveedor> proveedores) throws ArticuloValidadorException {
        try {
            ValidarAtributoUtil.validarObjetoNulo("Producto", producto);
            ValidarAtributoUtil.validarStringNuloVacio("Código", producto.getCodArticulo());
            ValidarAtributoUtil.validarStringNuloVacio("Descripción", producto.getDescripcion());
            ValidarAtributoUtil.validarDoubleNegativo("P. Venta", producto.getPventa());
            if (producto.getSerieList() != null) {
                for (int i = 0; i < producto.getSerieList().size(); i++) {
                    producto.getSerieList().get(i).setIdArticulo(producto);
                }
                for(int i=0;i<producto.getSerieList().size();i++)
                {
                    producto.getSerieList().get(i).setIdSucursal(configuraciones.getInstance().getSucursal());
                }
            }
            if (controladorArticulo.create(producto).equals("1")) {
                throw new ArticuloValidadorException(new IdDuplicadoException("Ya existe un producto con ese código", producto.getCodigo()));
            }
            
            ArticuloSucursalManager asm = new ArticuloSucursalManager();
            Articulosucursal articulosuc = new Articulosucursal();
            articulosuc.setIdArticulo(producto.getCodigo());
            articulosuc.setIdSucursal(configuraciones.getInstance().getSucursal().getIdsucursal());
            articulosuc.setStock(producto.getStock());
            asm.guardarArticulo(articulosuc);
            if (proveedores != null && !proveedores.isEmpty()) {
                GenericController<ProveedorArticulo> controladorPP = new GenericController<ProveedorArticulo>();
                for (int i = 0; i < proveedores.size(); i++) {
                    ProveedorArticulo agregar = new ProveedorArticulo();
                    agregar.setCodigoArticulo(producto);
                    agregar.setIdProveedor(proveedores.get(i));
                    controladorPP.create(agregar);
                }

            }
        } catch (AtributoInvalidoException ex) {
            throw new ArticuloValidadorException(ex);
        } catch (Exception ex) {
            throw new ArticuloValidadorException("Error Desconocido " + ex.getLocalizedMessage());
        }

    }
    
    private List<ProveedorArticulo> buscaProveedores(Articulo articulo)
    {
        List<ProveedorArticulo> listaProveedores = controladorProvArt.findWhere(new ProveedorArticulo(), "codigoArticulo="+articulo.getCodigo());
        return listaProveedores;
    }

    public void editarProducto(Articulo producto, List<Proveedor> proveedores, List<Serie> seriesAnteriores) throws ArticuloValidadorException {
        try {
            ValidarAtributoUtil.validarObjetoNulo("Producto", producto);
            ValidarAtributoUtil.validarStringNuloVacio("Código", producto.getCodArticulo());
            ValidarAtributoUtil.validarStringNuloVacio("Descripción", producto.getDescripcion());
            ValidarAtributoUtil.validarDoubleNegativo("P. Venta", producto.getPventa());
            if (seriesAnteriores != null) {
                GenericController<Serie> controladorSerie = new GenericController<Serie>();
                for (int i = 0; i < seriesAnteriores.size(); i++) {
                    controladorSerie.destroy(new Serie(), seriesAnteriores.get(i).getIdserie());
                }
            }
            if (producto.getSerieList() != null) {
                for (int i = 0; i < producto.getSerieList().size(); i++) {
                    producto.getSerieList().get(i).setIdArticulo(producto);
                }
                for(int i=0;i<producto.getSerieList().size();i++)
                {
                    producto.getSerieList().get(i).setIdSucursal(configuraciones.getInstance().getSucursal());
                }
            }
            controladorArticulo.edit(producto);
            ArticuloSucursalManager asm = new ArticuloSucursalManager();
            asm.modificarArticulo(producto, configuraciones.getInstance().getSucursal());
            GenericController<ProveedorArticulo> controladorPP = new GenericController<ProveedorArticulo>();
            for (int i = 0; i < producto.getProveedorArticuloList().size(); i++) {
                controladorPP.destroy(new ProveedorArticulo(), producto.getProveedorArticuloList().get(i).getIdproveedorarticulo());
            }
            if (proveedores != null && !proveedores.isEmpty()) {

                for (int i = 0; i < proveedores.size(); i++) {
                    ProveedorArticulo agregar = new ProveedorArticulo();
                    agregar.setCodigoArticulo(producto);
                    agregar.setIdProveedor(proveedores.get(i));
                    controladorPP.create(agregar);
                }

            }
        } catch (AtributoInvalidoException ex) {
            throw new ArticuloValidadorException(ex);
        } catch (Exception ex) {
            throw new ArticuloValidadorException("Error Desconocido " + ex.getLocalizedMessage());
        }
    }

    public List<Articulo> listarArticulos() {
        ArticuloSucursalManager asm = new ArticuloSucursalManager();
        SerieManager sm= new SerieManager();
        List<Articulo> listaArticulos = controladorArticulo.findWhere(new Articulo(), "Estado=0");
        if (listaArticulos != null) {
            for (int i = 0; i < listaArticulos.size(); i++) {
                listaArticulos.get(i).setStock(asm.verStock(listaArticulos.get(i), configuraciones.getInstance().getSucursal()));
               // listaArticulos.get(i).setSerieList(sm.buscarSeries(listaArticulos.get(i), configuraciones.getInstance().getSucursal()));
               // listaArticulos.get(i).setProveedorArticuloList(buscaProveedores(listaArticulos.get(i)));
            }
            return listaArticulos;
        }
        return null;
    }
    public Articulo buscaPorId(int id)
    {
        return controladorArticulo.find(new Articulo(), id);
    }
    public List<Serie> obtenerSeries(Articulo articulo)
    {
        SerieManager sm= new SerieManager();
        
        return sm.buscarSeries(articulo, configuraciones.getInstance().getSucursal());
    }
    public List<ProveedorArticulo> obtenProveedores(Articulo articulo)
    {
        return buscaProveedores(articulo);
    }
    
    public List<Articulo> listarArticulos(int ini, int max) {
        ArticuloSucursalManager asm = new ArticuloSucursalManager();
        List<Articulo> listaArticulos = controladorArticulo.findWhere(new Articulo(), "Estado=0",ini,max);
        if (listaArticulos != null) {
            for (int i = 0; i < listaArticulos.size(); i++) {
                listaArticulos.get(i).setStock(asm.verStock(listaArticulos.get(i), configuraciones.getInstance().getSucursal()));
               // listaArticulos.get(i).setSerieList(sm.buscarSeries(listaArticulos.get(i), configuraciones.getInstance().getSucursal()));
               // listaArticulos.get(i).setProveedorArticuloList();
            }
            return listaArticulos;
        }
        return null;
    }
    public List<Articulo> listarArticulos(Sucursal sucursal) {
        ArticuloSucursalManager asm = new ArticuloSucursalManager();
        SerieManager sm= new SerieManager();
        List<Articulo> listaArticulos = controladorArticulo.findWhere(new Articulo(), "Estado=0");
        if (listaArticulos != null) {
            for (int i = 0; i < listaArticulos.size(); i++) {
                listaArticulos.get(i).setStock(asm.verStock(listaArticulos.get(i),sucursal));
                //listaArticulos.get(i).setSerieList(sm.buscarSeries(listaArticulos.get(i), sucursal));
                //listaArticulos.get(i).setProveedorArticuloList(buscaProveedores(listaArticulos.get(i)));
            }
            return listaArticulos;
        }
        return null;
    }

    public List<Articulo> listarArticulos(String criterio, Sucursal sucursal) {
        ArticuloSucursalManager asm = new ArticuloSucursalManager();
        SerieManager sm= new SerieManager();
        List<Articulo> listaProducto = controladorArticulo.findHibernateSearch(new Articulo(), criterio, "codArticulo", "descripcion", "marca", "modelo");
        for (int i = listaProducto.size(); i > 0; i--) {
            if (listaProducto.get(i - 1).getEstado() == 1) {
                listaProducto.remove(i - 1);
            }else{
                listaProducto.get(i-1).setStock(asm.verStock(listaProducto.get(i-1),sucursal));
                //listaProducto.get(i-1).setSerieList(sm.buscarSeries(listaProducto.get(i-1), sucursal));
                //listaProducto.get(i-1).setProveedorArticuloList(buscaProveedores(listaProducto.get(i-1)));
            }
        }
        return listaProducto;
    }
    public List<Articulo> listarArticulos(String criterio) {
        ArticuloSucursalManager asm = new ArticuloSucursalManager();
        SerieManager sm= new SerieManager();
        List<Articulo> listaProducto = controladorArticulo.findHibernateSearch(new Articulo(), criterio, "codArticulo", "descripcion", "marca", "modelo");
        for (int i = listaProducto.size(); i > 0; i--) {
            if (listaProducto.get(i - 1).getEstado() == 1) {
                listaProducto.remove(i - 1);
            }
            /*else{
                listaProducto.get(i).setProveedorArticuloList(buscaProveedores(listaProducto.get(i)));
            }*/
        }
        return listaProducto;
    }

    public void eliminarArticulo(Articulo articulo) {
        articulo.setEstado(1);
        try {
            controladorArticulo.edit(articulo);
        } catch (Exception ex) {
        }
    }

    public Articulo buscarPorCodigo(String codigo, Sucursal sucursal) {
        try {
            Articulo articulo = controladorArticulo.findWhere(new Articulo(), "codArticulo='" + codigo + "' and estado=0").get(0);
            ArticuloSucursalManager asm = new ArticuloSucursalManager();
            articulo.setStock(asm.verStock(articulo, sucursal));
            articulo.setProveedorArticuloList(buscaProveedores(articulo));
            return articulo;
        } catch (Exception ex) {
            return null;
        }
    }

    public int buscaCodigo() {
        try {
            int codigo = controladorArticulo.findEntities(1, controladorArticulo.getCount(new Articulo()) - 1, new Articulo()).get(0).getCodigo().intValue() + 1;
            return codigo;
        } catch (Exception ex) {
            return 1;
        }
    }
    
    public void indexar(Articulo articulo)
    {
        //controladorArticulo.indexaEntidad(articulo);
    }
    
    public int contarArticulos()
    {
        return controladorArticulo.getCount(new Articulo(),"estado = 0");
    }
   
}
